Skip to content

[feature] 웹/웹뷰 통합 + 웹 바텀 네비게이션 마이그레이션 (MOA-942)#1643

Merged
seongwon030 merged 19 commits into
develop-fefrom
feature/#1642-webview-web-migration-MOA-942
Jun 8, 2026
Merged

[feature] 웹/웹뷰 통합 + 웹 바텀 네비게이션 마이그레이션 (MOA-942)#1643
seongwon030 merged 19 commits into
develop-fefrom
feature/#1642-webview-web-migration-MOA-942

Conversation

@seongwon030

@seongwon030 seongwon030 commented Jun 5, 2026

Copy link
Copy Markdown
Member

개요

앱의 네이티브 크롬을 제거하고 웹/웹뷰를 하나의 웹으로 통합합니다.
헤더는 로고+검색으로 통일, 네이티브 바텀탭은 웹 바텀 네비게이션으로 대체, /webview/* 경로 의존을 isInAppWebView()(UA MoadongApp) 한 갈래로 일원화했습니다.

기능 단위로 커밋을 쪼개뒀습니다. 커밋별로 리뷰하시면 따라가기 쉽습니다.


변경 사항 (기능 단위)

웹 바텀 네비게이션

  • feat(components) 웹 바텀 네비게이션 컴포넌트 추가 — RN app/(tabs) 스펙 이식(홈/구독/메뉴) · 49118d7b
  • fix(storybook) svg?react import 지원 추가 (스토리 렌더 오류 수정) · 3804dbfb
  • refactor(components) 바텀네비 아이콘 CSS mask → svg?react 틴팅 전환 · e5314c68

신규 페이지

  • feat 메뉴(/menu)·구독(/subscriptions) 페이지 추가 · 075f614e
    • 메뉴: 서비스 소개 · 총 동아리 연합회 · 개인정보 처리방침
    • 구독: 웹뷰 = 구독 목록(브릿지) / 순수 웹 = 앱 다운로드 CTA

레이아웃 셸

  • feat(layout) AppLayout 도입 → 핵심 네비 페이지에 바텀네비 마운트 · 26363a49

헤더 통일

  • refactor(header) 헤더를 로고+검색만으로 간소화 (메뉴 링크 → 메뉴 페이지) · 49f1c57a
  • fix(header) 검색창 반응형 정렬 (데스크톱 우측 / 태블릿 이하 꽉 채움) · f791af51
  • refactor(header) 소개·연합회 페이지 웹뷰에서도 통일 헤더 노출 · 309c4444

경로 통합

  • refactor(webview) 웹뷰를 웹 라우트로 통합 — /webview/* 리다이렉트화 + MainPage 병합(웹뷰 구독 버튼·APP_HOME 배너) · 114cfd17
  • refactor(webview) 홍보목록 웹뷰 분기 제거 + Filter 헤더 여백 정렬 · 5fa1a7e2

문서

  • docs(features) 웹/웹뷰 통합 라우팅으로 WebView 섹션 갱신 · 2379e165

검증

  • typecheck · lint · build · build-storybook 통과
  • useHeaderNavigation 테스트 17/17 통과

런타임 검증 (RN preview)

이 PR의 Vercel preview URL을 RN 앱 EXPO_PUBLIC_WEBVIEW_URL에 넣어 실기기/시뮬레이터에서 확인:

  • 웹뷰 /·/promotions — fixed 헤더 아래 콘텐츠/Filter 안 가림, 바텀네비 3탭
  • 메인 카드 구독 버튼 토글(네이티브 브릿지)
  • /webview/main/, /webview/club/:id/clubDetail/:id 리다이렉트
  • 카드 클릭(/clubDetail) · 뒤로가기

구버전 앱 호환

src/routes/webviewRoutes.tsx/webview/* → 웹 경로 리다이렉트(상대 경로)로 유지. 구버전 앱 진입 URL 보호용이라 제거 금지.

RN 연동 — Moadong/moadong-react-native#21

  • RN 셸이 /webview/main 로드 → 본 PR 리다이렉트로 / 진입 ✓
  • session_id는 FE 부트스트랩(index.tsx)에서 캡처돼 리다이렉트 전에 보존 ✓
  • 앱 버전 항목은 웹 메뉴에서 제외 → RN의 APP_VERSION 브릿지는 미사용으로 잔존(무해)

Summary by CodeRabbit

  • New Features

    • 웹에서 하단 네비게이션 추가 - 홈, 구독, 메뉴 탭으로 이동 가능
    • 메뉴 페이지 추가 - 서비스 소개, 동아리 연합회, 개인정보 처리방침 접근
    • 구독 페이지 추가 - 앱에서 구독한 동아리 확인 가능
  • Improvements

    • 헤더 및 레이아웃 개선으로 더 나은 사용자 환경 제공
    • 웹뷰와 웹 경험 통합으로 일관성 있는 인터페이스 제공
  • Documentation

    • 하단 네비게이션, 메뉴, 구독 페이지의 기능 문서 추가

앱 네이티브 바텀탭(홈/구독/메뉴)을 웹으로 이식.
- RN app/(tabs)/_layout.tsx 스펙 1:1 재현 (배경 #FFFFFF, 아이콘 28px, active #FF5414 / inactive #C5C5C5, height 56+safe-area)
- svgr 미사용 환경이라 홈/메뉴 SVG는 CSS mask로 틴팅 (배경 rect 제거)
- 구독 아이콘은 PNG 2-state 교체
- Z_INDEX.bottomNav, USER_EVENT.BOTTOM_TAB_CLICKED 추가
- 아직 레이아웃 미마운트 (독립 컴포넌트 + Storybook)
viteFinal plugins에 vite-plugin-svgr 추가. 기존엔 svgr가 없어
?react SVG import가 컴포넌트가 아닌 URL 문자열로 처리되어
해당 스토리에서 "Invalid element name" 렌더 오류가 발생했다.
프로젝트 컨벤션(vite-plugin-svgr)에 맞춰 홈/메뉴 아이콘을
svg?react 컴포넌트로 import하고 부모 Tab의 color(currentColor)를
상속해 active/inactive 틴팅. 기존 mask 방식 제거.
- 구독 페이지(/subscriptions): 웹뷰=구독 동아리 목록(브릿지), 순수 웹=앱 다운로드 CTA
- 메뉴 페이지(/menu): 서비스 소개·총 동아리 연합회·개인정보 처리방침 (RN 더보기 이식)
- PAGE_VIEW/PAGE_NAME 상수, /subscriptions·/menu 라우트 추가
- src/layouts/AppLayout: Outlet + BottomNavigation + 하단 여백(safe-area 반영)
- /, /introduce, /club-union, /promotions, /subscriptions, /menu 6개를
  중첩 라우트 레이아웃으로 묶어 바텀네비 노출
- 상세/홍보상세/지원폼/게임/관리자/콜백/웹뷰는 그룹 밖(미노출)
- 헤더는 미변경 (로고+검색 통일은 별도 단계)
- nav 메뉴 링크 3개 + 햄버거/모바일 드롭다운 제거 (메뉴는 바텀네비/메뉴페이지로 이동)
- Nav/NavLink/MenuBar/MenuButton 스타일 및 useHeaderNavigation 햄버거 핸들러 제거
- 검색창이 우측에 몰리던 문제 수정: 로고 옆에서 공간 채우도록 (데스크톱 480px 상한)
- webviewRoutes를 /webview/* → 웹 경로 리다이렉트로 전환 (구버전 앱 진입 URL 보호)
- WebviewMainPage를 MainPage로 병합 (웹뷰: 카드 구독 버튼·APP_HOME 배너·웹뷰 페이지뷰, Popup/Footer는 웹 전용)
- SubscribeButton을 MainPage/components로 이전
- Filter/SearchBox/usePromotionNotification: /webview 문자열 → isInAppWebView()
- WebviewGlobalStyles를 App에서 웹뷰 전역 주입, WebviewLayout/webviewFilterConfig 삭제
헤더 간소화로 nav가 빠진 뒤 검색창이 한쪽으로 쏠리던 문제 수정.
- 데스크톱·랩탑(>700px): width 345px + margin-left auto로 우측 정렬
- 태블릿·모바일·웹뷰(≤700px): flex:1로 꽉 채움
경로 통합으로 웹뷰가 웹 라우트를 사용하게 되어, IntroducePage·ClubUnionPage의
hideOn={['webview']} 제거 → 웹뷰에서도 로고+검색 헤더가 보이도록.
- PromotionListPage의 웹뷰 SearchBarArea 분기 제거 → 통일 헤더 단일 렌더
- Filter margin-top을 56px로 고정 → 경로 통합으로 웹뷰에 생긴 fixed 헤더를
  Filter가 클리어하도록 (MainPage·홍보목록의 헤더 가림 수정)
- SearchBarArea/LogoImage/$isWebview 스타일 정리
webviewFilterConfig 삭제·경로 통합을 반영 — isInAppWebView 기반 분기,
AppLayout/바텀네비, /webview 리다이렉트 호환 설명으로 교체.
@vercel

vercel Bot commented Jun 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
moadong Ready Ready Preview, Comment Jun 8, 2026 12:59am

@github-actions github-actions Bot added ✨ Feature 기능 개발 💻 FE Frontend 🚁AI claude, codex 활용 시 labels Jun 5, 2026
@coderabbitai

coderabbitai Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@seongwon030, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 57 minutes and 25 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 59c94d68-7fad-4ff0-9a72-2432089de719

📥 Commits

Reviewing files that changed from the base of the PR and between ec6fd0e and c17a503.

📒 Files selected for processing (12)
  • frontend/docs/features/components/bottom-navigation.md
  • frontend/docs/features/menu/menu-page.md
  • frontend/docs/features/subscriptions/subscriptions-page.md
  • frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts
  • frontend/src/components/common/BottomNavigation/BottomNavigation.tsx
  • frontend/src/components/common/Header/Header.styles.ts
  • frontend/src/components/common/Header/Header.tsx
  • frontend/src/layouts/AppLayout.styles.ts
  • frontend/src/pages/MenuPage/MenuPage.styles.ts
  • frontend/src/pages/MenuPage/MenuPage.tsx
  • frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx
  • frontend/src/utils/getAppVersion.ts

Warning

.coderabbit.yaml has a parsing error

The CodeRabbit configuration file in this repository has a parsing error and default settings were used instead. Please fix the error(s) in the configuration file. You can initialize chat with CodeRabbit to get help with the configuration file.

💥 Parsing errors (1)
Validation error: Invalid regex pattern for base branch. at "reviews.auto_review.base_branches[0]"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

웹과 웹뷰 라우팅을 통합하고 AppLayout 기반 공통 셸을 도입하며 BottomNavigation, MenuPage, SubscriptionsPage를 추가합니다. 웹뷰 경로를 웹 경로로 리다이렉트하고 헤더 메뉴를 제거합니다.

Changes

웹/웹뷰 통합 UI 및 라우팅 재구성

Layer / File(s) Summary
BottomNavigation 컴포넌트 및 이벤트 기초
frontend/src/components/common/BottomNavigation/BottomNavigation.tsx, BottomNavigation.styles.ts, BottomNavigation.stories.tsx, frontend/src/constants/eventName.ts, frontend/.storybook/main.ts
하단 탭 네비게이션을 구현하고 홈/구독/메뉴 탭을 정의합니다. 탭 클릭 시 활성 상태를 계산하고 Mixpanel 이벤트를 기록한 후 경로를 이동합니다. Storybook에 3개 스토리(Home, Subscriptions, Menu)를 추가하고 Vite svgr 플러그인을 구성합니다.
AppLayout 도입과 메인 라우트 중첩
frontend/src/layouts/AppLayout.tsx, AppLayout.styles.ts, frontend/src/routes/AppRoutes.tsx
AppLayout 컴포넌트를 정의하고 Outlet과 BottomNavigation을 함께 렌더링합니다. 메인 페이지 6개 경로를 element: <AppLayout /> 아래 children 구조로 중첩하여 공통 레이아웃을 적용합니다.
웹뷰 경로 리다이렉트 및 필터/검색 통합
frontend/src/routes/webviewRoutes.tsx, frontend/src/components/common/Filter/Filter.tsx, Filter.styles.ts, frontend/src/pages/MainPage/components/SearchBox/SearchBox.tsx, frontend/src/hooks/Queries/usePromotionNotification.ts, frontend/src/routes/webviewFilterConfig.ts
웹뷰 경로(/webview/main, /webview/promotions, /webview/club/*)를 웹 경로로 리다이렉트합니다. Filter, SearchBox, 알림 훅의 webview 경로 분기를 제거하고 isInAppWebView() 기반으로 통합합니다.
MenuPage 추가 (메뉴/더보기 페이지)
frontend/src/pages/MenuPage/MenuPage.tsx, MenuPage.styles.ts, frontend/src/constants/eventName.ts, frontend/docs/features/menu/menu-page.md
MenuPage 컴포넌트를 구현하고 서비스 소개, 동아리 연합회, 개인정보 처리방침 메뉴 항목을 렌더링합니다. 페이지뷰 추적과 헤더 네비게이션을 연결합니다.
SubscriptionsPage 추가 (구독 동아리 페이지)
frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx, SubscriptionsPage.styles.ts, frontend/src/constants/eventName.ts, frontend/docs/features/subscriptions/subscriptions-page.md
SubscriptionsPage를 구현하고 웹뷰 환경 감지에 따라 구독 동아리 목록 또는 앱 다운로드 CTA를 렌더링합니다. 로딩/에러/빈 상태를 처리합니다.
MainPage 웹뷰 구독 토글 통합
frontend/src/pages/MainPage/MainPage.tsx, frontend/src/pages/MainPage/components/SubscribeButton/SubscribeButton.tsx, SubscribeButton.styles.ts, frontend/src/App.tsx
MainPage에서 isInAppWebView() 기반으로 ClubCard에 조건부 SubscribeButton을 렌더링합니다. Banner/Footer를 조건부로 표시하고 웹뷰 전용 전역 스타일을 App.tsx에서 적용합니다.
Header 메뉴 제거 및 레이아웃 정리
frontend/src/components/common/Header/Header.tsx, Header.styles.ts, frontend/src/hooks/Header/useHeaderNavigation.ts, frontend/src/pages/PromotionPage/PromotionListPage.tsx, PromotionListPage.styles.ts, frontend/src/pages/ClubUnionPage/ClubUnionPage.tsx, frontend/src/pages/IntroducePage/IntroducePage.tsx
Header에서 모바일 메뉴 렌더링을 제거하고 검색 영역을 정리합니다. PromotionListPage의 webview 전용 UI 분기를 제거하고 클럽 페이지의 헤더 hideOn 속성을 제거합니다.
지원 변경
frontend/src/styles/Global.styles.ts, frontend/src/styles/zIndex.ts, frontend/docs/claude/features.md, frontend/docs/features/components/bottom-navigation.md
전역 스타일에 scrollbar-gutter: stable 추가, z-index 상수에 bottomNav: 1000 정의, 라우팅 및 컴포넌트 문서 작성을 완료합니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

  • Moadong/moadong#1552: Filter 컴포넌트의 웹뷰 필터 옵션 및 경로 분기 처리 변경으로 직접 연결됩니다.
  • Moadong/moadong#1536: webviewFilterConfig와 webviewRoutes의 통합 리팩토링으로 코드 레벨에서 강하게 연관됩니다.
  • Moadong/moadong#908: Z_INDEX 상수화 및 전역 z-index 체계와 동일 파일/목적의 변경입니다.

Suggested reviewers

  • suhyun113
  • oesnuj
  • lepitaaar
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 핵심 변경사항인 웹/웹뷰 통합과 웹 바텀 네비게이션 마이그레이션을 명확하게 요약하고 있습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/#1642-webview-web-migration-MOA-942

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

🎨 UI 변경사항을 확인해주세요

변경된 스토리를 Chromatic에서 확인해주세요.

구분 링크
🔍 변경사항 리뷰 https://www.chromatic.com/build?appId=67904e61c16daa99a63b44a7&number=431
📖 Storybook https://67904e61c16daa99a63b44a7-sbyprqbizi.chromatic.com/

59개 스토리 변경 · 전체 60개 스토리 · 23개 컴포넌트

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request unifies the web and in-app webview routing by introducing a shared layout with a bottom navigation bar (BottomNavigation), a new MenuPage, and a SubscriptionsPage, while removing redundant webview-specific pages and adding backward-compatible redirects. The review feedback highlights several important improvements, including resolving a UX issue where sub-pages do not correctly keep their parent navigation tabs active, preventing potential runtime crashes by safely handling cases where subscribedClubIds might be undefined, and restricting the maximum width of the bottom navigation bar on desktop screens to maintain a clean layout.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread frontend/src/components/common/BottomNavigation/BottomNavigation.tsx Outdated
Comment thread frontend/src/pages/MainPage/MainPage.tsx
Comment thread frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx
Comment thread frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx
- isTabActive: /promotions→홈, /introduce·/club-union→메뉴 활성 유지
- 데스크톱에서 바는 풀폭 유지하되 탭 묶음을 max-width 500px 가운데 정렬
(PR #1643 Gemini 리뷰 반영)
@seongwon030 seongwon030 changed the title feat: 웹/웹뷰 통합 + 웹 바텀 네비게이션 마이그레이션 (MOA-942) [feature] 웹/웹뷰 통합 + 웹 바텀 네비게이션 마이그레이션 (MOA-942) Jun 7, 2026
데스크톱 클래식 스크롤바 환경에서 페이지별 스크롤바 유무에 따라
뷰포트 폭이 바뀌어 가운데 정렬된 바텀네비가 좌우로 밀리던 문제 수정.
html에 scrollbar-gutter: stable 추가로 스크롤바 자리를 항상 예약.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (4)
frontend/src/layouts/AppLayout.styles.ts (1)

4-4: ⚡ Quick win

매직 넘버를 상수로 추출하는 것을 고려하세요.

56px가 하드코딩되어 있는데, 이는 BottomNavigation의 높이와 일치해야 합니다. 두 컴포넌트 간의 계약을 명확히 하고 향후 높이 변경 시 동기화를 보장하기 위해 공통 상수로 추출하는 것이 좋습니다.

예: src/constants/layout.tsBOTTOM_NAV_HEIGHT = 56 정의 후 양쪽에서 참조

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/layouts/AppLayout.styles.ts` at line 4, The padding-bottom in
AppLayout.styles.ts uses a hardcoded "56px" magic number; extract this value
into a shared constant (e.g., BOTTOM_NAV_HEIGHT) in a central module (suggested
symbol: BOTTOM_NAV_HEIGHT in src/constants/layout.ts) and update both
AppLayout.styles.ts and the BottomNavigation component to import and use that
constant so the layout contract is explicit and stays synchronized when the nav
height changes.
frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts (1)

10-11: ⚡ Quick win

하드코딩된 색상을 theme에서 가져오는 것을 권장합니다.

Nav 컴포넌트의 background-colorborder-top 색상이 하드코딩되어 있습니다(#ffffff, #f0f0f0). Tab 컴포넌트에서는 theme.colors를 사용하고 있으므로, 일관성을 위해 Nav에서도 theme을 사용하는 것이 좋습니다.

♻️ theme 사용 제안
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
- background-color: `#ffffff`;
- border-top: 1px solid `#f0f0f0`;
+ background-color: ${theme.colors.white};
+ border-top: 1px solid ${theme.colors.gray[100]};
  padding-bottom: env(safe-area-inset-bottom);
  z-index: ${Z_INDEX.bottomNav};
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts`
around lines 10 - 11, Nav component currently hardcodes background-color
(`#ffffff`) and border-top color (`#f0f0f0`); update Nav's styles to use the theme
(same approach as Tab) by replacing the hardcoded values with theme references
(e.g., theme.colors.background / theme.colors.surface or the appropriate names
used in your theme) so the Nav styling is consistent with Tab; locate the Nav
style definition in BottomNavigation.styles.ts and swap the literal colors for
theme.* tokens and ensure the styled-component receives the theme prop if not
already.
frontend/src/components/common/BottomNavigation/BottomNavigation.tsx (1)

31-31: ⚡ Quick win

탭 key 이름과 label/path의 불일치를 확인하세요.

TABS 배열의 두 번째 탭이 key: 'explore'로 되어 있지만, 실제 label은 '구독'이고 path/subscriptions입니다. 의미상 일관성을 위해 key를 'subscriptions'로 변경하는 것이 더 명확할 수 있습니다.

💡 제안된 수정
  {
-   key: 'explore',
+   key: 'subscriptions',
    label: '구독',
    path: '/subscriptions',
    icon: {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/src/components/common/BottomNavigation/BottomNavigation.tsx` at line
31, The TABS entry uses key: 'explore' while its label is '구독' and path is
'/subscriptions'—change the tab's key to 'subscriptions' for semantic
consistency (update the TABS array entry replacing 'explore' with
'subscriptions' in BottomNavigation's TABS constant) and then search for any
usages of the old 'explore' key (e.g., active tab state, switch/case,
localStorage keys, tests or analytics) and update them to the new
'subscriptions' key so all references remain consistent.
frontend/docs/features/components/bottom-navigation.md (1)

10-10: 💤 Low value

마크다운 강조 구문 오인 방지를 위해 파일명 표기를 개선하세요.

Line 10의 subscribe_selected / _unselected.png 표기에서 공백과 underscore 조합이 마크다운 강조 구문(_..._)으로 오인될 수 있습니다. 파일명을 백틱으로 감싸거나 슬래시 전후 공백을 제거해주세요.

제안하는 수정안
-| 구독 | `/subscriptions` | subscribe_selected / _unselected.png (2-state) |
+| 구독 | `/subscriptions` | `subscribe_selected`/`_unselected.png` (2-state) |

또는:

-| 구독 | `/subscriptions` | subscribe_selected / _unselected.png (2-state) |
+| 구독 | `/subscriptions` | subscribe_selected/_unselected.png (2-state) |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/docs/features/components/bottom-navigation.md` at line 10, 테이블 셀에 있는
파일명 표기 "subscribe_selected / _unselected.png"이 마크다운의 강조 구문으로 오인될 수 있으니, 해당 셀(문자열
subscribe_selected / _unselected.png)을 찾아 파일명들을 각각 백틱으로 감싸거나 슬래시 양쪽의 공백을 제거해
`subscribe_selected` / `_unselected.png` 또는 `subscribe_selected/_unselected.png`
형식으로 수정하세요.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/docs/features/menu/menu-page.md`:
- Line 31: 현재 문서의 한 문장(31번)에서 “아직 공용 레이아웃에 부착되지 않은 독립 페이지”라고 되어 있는데 실제 동작은
/menu가 AppLayout 하위 라우트로 연결되어 있으므로 문구를 최신화해야 합니다; menu 페이지 설명을 “/menu는
AppLayout의 하위 라우트로 공용 헤더/바텀네비(AppLayout)를 사용합니다” 같은 문장으로 교체하고, 관련 문구가 라우팅(특히
AppLayout과 /menu 연결)을 올바르게 반영하도록 수정하세요.

In `@frontend/docs/features/subscriptions/subscriptions-page.md`:
- Line 18: Update the documentation references to match the current code:
replace the incorrect `WebviewMainPage/components/SubscribeButton` path with the
actual import path `MainPage/components/SubscribeButton` and ensure the listed
components remain `src/pages/MainPage/components/ClubCard/ClubCard.tsx` and
`src/pages/MainPage/components/SubscribeButton/SubscribeButton.tsx`; also update
the page description for `/subscriptions` to state that it is a nested route
under `AppLayout` (not an independent top-level page). Ensure both changed
mentions (the SubscribeButton path and the /subscriptions layout note) are
updated consistently in the subscriptions-page.md text.

In `@frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx`:
- Around line 82-84: The onClick handler on Styled.CtaButton uses
window.open(getAppStoreLink(), '_blank') which exposes window.opener and risks
reverse tabnabbing; update the onClick to open the link with protection by
either passing the noopener,noreferrer feature string to window.open (e.g. use
window.open(getAppStoreLink(), '_blank', 'noopener,noreferrer')) or immediately
nulling the opener on the returned window (const w = window.open(...); if (w)
w.opener = null); apply this change in the onClick function tied to
Styled.CtaButton/getAppStoreLink.
- Around line 15-17: The page-view tracking call is placed only inside
SubscribedClubs, causing the non-webview branch to miss the /subscriptions
pageview; move the useTrackPageView(PAGE_VIEW.SUBSCRIPTIONS_PAGE) invocation up
into the SubscriptionsPage component (top-level of the component) so both
branches (webview and non-webview render paths) run the tracker, and remove the
duplicate call from SubscribedClubs to avoid double-tracking.

---

Nitpick comments:
In `@frontend/docs/features/components/bottom-navigation.md`:
- Line 10: 테이블 셀에 있는 파일명 표기 "subscribe_selected / _unselected.png"이 마크다운의 강조
구문으로 오인될 수 있으니, 해당 셀(문자열 subscribe_selected / _unselected.png)을 찾아 파일명들을 각각 백틱으로
감싸거나 슬래시 양쪽의 공백을 제거해 `subscribe_selected` / `_unselected.png` 또는
`subscribe_selected/_unselected.png` 형식으로 수정하세요.

In `@frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts`:
- Around line 10-11: Nav component currently hardcodes background-color
(`#ffffff`) and border-top color (`#f0f0f0`); update Nav's styles to use the theme
(same approach as Tab) by replacing the hardcoded values with theme references
(e.g., theme.colors.background / theme.colors.surface or the appropriate names
used in your theme) so the Nav styling is consistent with Tab; locate the Nav
style definition in BottomNavigation.styles.ts and swap the literal colors for
theme.* tokens and ensure the styled-component receives the theme prop if not
already.

In `@frontend/src/components/common/BottomNavigation/BottomNavigation.tsx`:
- Line 31: The TABS entry uses key: 'explore' while its label is '구독' and path
is '/subscriptions'—change the tab's key to 'subscriptions' for semantic
consistency (update the TABS array entry replacing 'explore' with
'subscriptions' in BottomNavigation's TABS constant) and then search for any
usages of the old 'explore' key (e.g., active tab state, switch/case,
localStorage keys, tests or analytics) and update them to the new
'subscriptions' key so all references remain consistent.

In `@frontend/src/layouts/AppLayout.styles.ts`:
- Line 4: The padding-bottom in AppLayout.styles.ts uses a hardcoded "56px"
magic number; extract this value into a shared constant (e.g.,
BOTTOM_NAV_HEIGHT) in a central module (suggested symbol: BOTTOM_NAV_HEIGHT in
src/constants/layout.ts) and update both AppLayout.styles.ts and the
BottomNavigation component to import and use that constant so the layout
contract is explicit and stays synchronized when the nav height changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a24b728c-b8e4-4e0f-b4d3-a0e22740f341

📥 Commits

Reviewing files that changed from the base of the PR and between 36b9d3b and ec6fd0e.

⛔ Files ignored due to path filters (8)
  • frontend/src/assets/images/icons/bottomNav/home.svg is excluded by !**/*.svg
  • frontend/src/assets/images/icons/bottomNav/menu.svg is excluded by !**/*.svg
  • frontend/src/assets/images/icons/bottomNav/subscribe_selected.png is excluded by !**/*.png
  • frontend/src/assets/images/icons/bottomNav/subscribe_unselected.png is excluded by !**/*.png
  • frontend/src/assets/images/icons/menu/chevron.svg is excluded by !**/*.svg
  • frontend/src/assets/images/icons/menu/document.svg is excluded by !**/*.svg
  • frontend/src/assets/images/icons/menu/info.svg is excluded by !**/*.svg
  • frontend/src/assets/images/icons/menu/people.svg is excluded by !**/*.svg
📒 Files selected for processing (38)
  • frontend/.storybook/main.ts
  • frontend/docs/claude/features.md
  • frontend/docs/features/components/bottom-navigation.md
  • frontend/docs/features/menu/menu-page.md
  • frontend/docs/features/subscriptions/subscriptions-page.md
  • frontend/src/App.tsx
  • frontend/src/components/common/BottomNavigation/BottomNavigation.stories.tsx
  • frontend/src/components/common/BottomNavigation/BottomNavigation.styles.ts
  • frontend/src/components/common/BottomNavigation/BottomNavigation.tsx
  • frontend/src/components/common/Filter/Filter.styles.ts
  • frontend/src/components/common/Filter/Filter.tsx
  • frontend/src/components/common/Header/Header.styles.ts
  • frontend/src/components/common/Header/Header.tsx
  • frontend/src/constants/eventName.ts
  • frontend/src/hooks/Header/useHeaderNavigation.ts
  • frontend/src/hooks/Queries/usePromotionNotification.ts
  • frontend/src/layouts/AppLayout.styles.ts
  • frontend/src/layouts/AppLayout.tsx
  • frontend/src/pages/ClubUnionPage/ClubUnionPage.tsx
  • frontend/src/pages/IntroducePage/IntroducePage.tsx
  • frontend/src/pages/MainPage/MainPage.tsx
  • frontend/src/pages/MainPage/components/SearchBox/SearchBox.tsx
  • frontend/src/pages/MainPage/components/SubscribeButton/SubscribeButton.styles.ts
  • frontend/src/pages/MainPage/components/SubscribeButton/SubscribeButton.tsx
  • frontend/src/pages/MenuPage/MenuPage.styles.ts
  • frontend/src/pages/MenuPage/MenuPage.tsx
  • frontend/src/pages/PromotionPage/PromotionListPage.styles.ts
  • frontend/src/pages/PromotionPage/PromotionListPage.tsx
  • frontend/src/pages/SubscriptionsPage/SubscriptionsPage.styles.ts
  • frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx
  • frontend/src/pages/WebviewLayout/WebviewLayout.tsx
  • frontend/src/pages/WebviewMainPage/WebviewMainPage.styles.ts
  • frontend/src/pages/WebviewMainPage/WebviewMainPage.tsx
  • frontend/src/routes/AppRoutes.tsx
  • frontend/src/routes/webviewFilterConfig.ts
  • frontend/src/routes/webviewRoutes.tsx
  • frontend/src/styles/Global.styles.ts
  • frontend/src/styles/zIndex.ts
💤 Files with no reviewable changes (5)
  • frontend/src/pages/WebviewMainPage/WebviewMainPage.styles.ts
  • frontend/src/hooks/Header/useHeaderNavigation.ts
  • frontend/src/routes/webviewFilterConfig.ts
  • frontend/src/pages/WebviewLayout/WebviewLayout.tsx
  • frontend/src/pages/WebviewMainPage/WebviewMainPage.tsx

Comment thread frontend/docs/features/menu/menu-page.md Outdated
Comment thread frontend/docs/features/subscriptions/subscriptions-page.md Outdated
Comment thread frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx
Comment thread frontend/src/pages/SubscriptionsPage/SubscriptionsPage.tsx
- BottomNavigation: tablet(≤700px) 이하에서만 표시
- AppLayout: 하단 패딩도 tablet 이하에서만 적용
- Header: 데스크톱에서 소개/연합회/홍보 nav links 복원

@suhyun113 suhyun113 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨어요!
데탑에서도 보이는 바텀 네비게이션바 잘 제거해주셨네요~

다만 모바일 웹에서 네비게이션바를 통해 다른 탭으로 이동하는 경우 뒤로가기를 했을때 안 이전 탭으로 이동하는 문제가 아직 남아있는 것 같아서 수정해주시면 될 것 같아요!

- 바텀네비 탭 클릭 시 replace 네비게이션으로 history 오염 방지 (suhyun113)
- TABS 구독 탭 key 'explore' → 'subscriptions' 의미 일치 수정
- useTrackPageView를 SubscriptionsPage 최상위로 이동 (웹 분기 트래킹 누락 수정)
- window.open에 noopener,noreferrer 추가 (reverse tabnabbing 방지)
- 문서 3곳 최신화: menu/subscriptions AppLayout 하위 라우트로 수정, SubscribeButton 경로 수정, 마크다운 강조 오인 수정
@seongwon030

Copy link
Copy Markdown
Member Author

수고하셨어요! 데탑에서도 보이는 바텀 네비게이션바 잘 제거해주셨네요~

다만 모바일 웹에서 네비게이션바를 통해 다른 탭으로 이동하는 경우 뒤로가기를 했을때 안 이전 탭으로 이동하는 문제가 아직 남아있는 것 같아서 수정해주시면 될 것 같아요!

뒤로 가기 방지 했습니다 !

@seongwon030 seongwon030 merged commit 4ae956d into develop-fe Jun 8, 2026
6 checks passed
@seongwon030 seongwon030 deleted the feature/#1642-webview-web-migration-MOA-942 branch June 8, 2026 01:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚁AI claude, codex 활용 시 💻 FE Frontend ✨ Feature 기능 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants